Fortran For Fun之block结构

在fortran2008标准中新添加了一种block结构,该结构允许程序在block里定义新的局部变量以及操作。对于某些程序很长的程序,可以分解成几个block,然后在每个block里面定义变量以及操作。这样逻辑更加清晰,并且block里面的局部变量的获取速度会快很多。

block 结构

block里面可以直接使用以及修改全局的变量,block里面的局部变量名称可以与全局变量名称一致,对于名称相同的变量,block里面只会修改局部变量,对全局变量没有影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
program learn_block
implicit none
real :: i, j = 20.
i = 30.0
block
integer :: i
do i = 1,3
print*, i
enddo
print*,j
j = 10.
end block
print*,i
print*,j
end program learn_block

结果

1
2
3
4
5
6
1
2
3
20.000000000000000
30.000000000000000
10.000000000000000

可以看出局部变量的修改不会影响全局变量,局部对全局变量的修改会影响全局变量。

do concurrent

do comcurrent是指每个循环之间没有依赖的循环,使用do concurrent说明这种循环可以使处理器更容易对循环进行并行处理,以提高效率。由于block里面的局部变量获取速度更快,所以可以在do comcurrent循环里面定义block,得到更高的效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program learn_doconcurrent
implicit none
integer, parameter :: n = 5
integer :: i
real :: a(n),c(n)
forall(i=1:n)
a(i) = real(i)
endforall
do concurrent (i = 1:n)
block
real :: r
r= a(i)**2
c(i) = sqrt(r)
end block
end do
if(all(a==c)) print*, 'pass'
end program learn_doconcurrent

结果

1
pass